/*
 * Copyright (c) 2007-2020 西安交通信息投资营运有限公司 版权所有
 */

package com.xci.edu.core.service;

import com.github.lvyanyang.annotation.OperateLog;
import com.xci.edu.core.entity.EduStudentQuestionFavorite;
import com.xci.edu.core.dao.EduStudentQuestionFavoriteDao;
import com.xci.edu.core.filter.EduStudentQuestionFavoriteFilter;
import com.github.lvyanyang.core.BaseService;
import com.github.lvyanyang.core.BoolResult;
import com.github.lvyanyang.core.PageList;
import com.github.lvyanyang.core.Param;
import com.github.lvyanyang.core.XCI;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.Cache;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 学员题库收藏服务
 * @author 焦元义 jiaoyuanyi@xci96716.com
 * @since 2020-11-24 15:14:37
 */
@Service
public class EduStudentQuestionFavoriteService extends BaseService {
    /** 学员题库收藏数据层对象 */
    @Resource private EduStudentQuestionFavoriteDao eduStudentQuestionFavoriteDao;

    /**
     * 新建学员题库收藏
     * @param entity 学员题库收藏实体
     */
    @OperateLog(msg = "新建学员题库收藏", module = "学员题库收藏")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult insert(EduStudentQuestionFavorite entity) {
        return save(entity, true);
    }

    /**
     * 修改学员题库收藏
     * @param entity 学员题库收藏实体
     */
    @OperateLog(msg = "修改学员题库收藏", module = "学员题库收藏")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult update(EduStudentQuestionFavorite entity) {
        return save(entity, false);
    }

    /**
     * 修改学员题库收藏状态
     * @param ids    学员题库收藏主键字符串
     * @param status 学员题库收藏状态
     */
    @OperateLog(msg = "修改学员题库收藏状态", module = "学员题库收藏")
    @Transactional(rollbackFor = Exception.class)
    public void updateStatus(@NotBlank(message = "请指定学员题库收藏主键字符串") String ids, @NotNull(message = "请指定学员题库收藏状态") Boolean status) {
        XCI.forEachIds(ids, id -> {
            eduStudentQuestionFavoriteDao.updateStatus(id, status);
        });
    }

    ///**
    // * 批量保存学员题库收藏
    // * @param entities 学员题库收藏实体集合
    // */
    //@OperateLog(msg = "修改学员题库收藏", module = "学员题库收藏")
    //@Transactional(rollbackFor = Exception.class)
    //public void batchSave(List<EduStudentQuestionFavorite> entities) {
    //    for (EduStudentQuestionFavorite entity : entities) {
    //        if (entity.getId() == null || !eduStudentQuestionFavoriteDao.existById(entity.getId())) {
    //            //无主键或者主键在数据库中不存在,则新建;
    //            self.save(entity, true).ifFailThrow();
    //        } else {
    //            //其他情况,则修改
    //            self.save(entity, false).ifFailThrow();
    //        }
    //    }
    //}

    /**
     * 删除学员题库收藏
     * @param ids 学员题库收藏主键字符串
     */
    @OperateLog(msg = "删除学员题库收藏", module = "学员题库收藏")
    @Transactional(rollbackFor = Exception.class)
    public BoolResult delete(@NotBlank(message = "请指定学员题库收藏主键字符串") String ids) {
        XCI.forEachIds(ids, id -> {
            var entity = eduStudentQuestionFavoriteDao.selectById(id);
            if (entity == null) return;

            eduStudentQuestionFavoriteDao.deleteById(entity.getId());
            //logService.saveDeleteHistoryLogAsync(entity.getId(), entity);
        });
        return BoolResult.success();
    }

    ///**
    // * 是否存在指定主键的学员题库收藏
    // * @param id 学员题库收藏主键
    // * @return 如果存在返回true
    // */
    //public boolean existById(@NotNull(message = "请指定学员题库收藏主键") Long id) {
    //    return eduStudentQuestionFavoriteDao.existxById(id);
    //}

    ///**
    // * 是否存在指定名称的学员题库收藏
    // * @param name      学员题库收藏名称
    // * @param excludeId 排除的主键，如果为null则不指定排除的主键
    // * @return 如果存在返回true
    // */
    //public boolean existByName(@NotBlank(message = "请指定学员题库收藏名称") String name, Long excludeId) {
    //    return eduStudentQuestionFavoriteDao.existxByName(name, excludeId);
    //}

    ///**
    // * 检查学员题库收藏编码是否存在
    // * @param code      学员题库收藏编码
    // * @param excludeId 排除的主键,可为空
    // * @return 如果存在返回true
    // */
    //public boolean existByCode(@NotBlank(message = "请指定学员题库收藏编码") String code, Long excludeId) {
    //    return eduStudentQuestionFavoriteDao.existxByCode(code, excludeId);
    //}

    /**
     * 根据主键查询单个学员题库收藏
     * @param id 学员题库收藏主键
     * @return 返回学员题库收藏实体
     */
    public EduStudentQuestionFavorite selectById(@NotNull(message = "请指定学员题库收藏主键") Long id) {
        return eduStudentQuestionFavoriteDao.selectById(id);
    }

    ///**
    // * 根据编码查询单个学员题库收藏
    // * @param code 学员题库收藏编码
    // * @return 返回学员题库收藏实体
    // */
    //public EduStudentQuestionFavorite selectByCode(@NotBlank(message = "请指定学员题库收藏编码") String code) {
    //    return eduStudentQuestionFavoriteDao.selectByCode(code);
    //}

    /**
     * 查询学员题库收藏列表
     * @param filter 过滤条件
     * @return 返回学员题库收藏列表
     */
    public List<EduStudentQuestionFavorite> selectList(EduStudentQuestionFavoriteFilter filter) {
        return eduStudentQuestionFavoriteDao.selectList(filter);
    }

    /**
     * 查询学员题库收藏分页列表
     * @param filter 过滤条件
     * @return 返回学员题库收藏分页列表
     */
    public PageList<EduStudentQuestionFavorite> selectPageList(EduStudentQuestionFavoriteFilter filter) {
        return PageList.of(eduStudentQuestionFavoriteDao.selectPageList(filter));
    }

    /**
     * 保存数据,在insert和update之前和之后的校验和处理
     * @param entity  学员题库收藏实体
     * @param created 是否新建
     */
    private BoolResult save(EduStudentQuestionFavorite entity, boolean created) {
        //新建时如果主键未指定,自动设置主键
        XCI.ifTrueAction(XCI.invalidId(entity.getId(), created), () -> entity.setId(XCI.nextId()));
        //如果简拼为空,设置简拼
        //XCI.ifBlankAction(entity.getSpell(), () -> entity.setSpell(XCI.getSpell(entity.getName())));

        //检查学员题库收藏编码是否存在
        //if (eduStudentQuestionFavoriteDao.existxByCode(entity.getCode(), XCI.getExcludeId(entity.getId(), created))) {
        //    return BoolResult.fail(XCI.format("学员题库收藏编码[{}]已经存在", entity.getCode()));
        //}

        //更新数据库
        if (created) {
            eduStudentQuestionFavoriteDao.insert(entity);
            //logService.saveInsertHistoryLogAsync(entity.getId(), entity);
        } else {
            //var before = eduStudentQuestionFavoriteDao.selectById(entity.getId());
            eduStudentQuestionFavoriteDao.update(entity);
            //logService.saveUpdateHistoryLogAsync(entity.getId(), before, entity);
        }
        return BoolResult.success();
    }
}